 package com.hb.G_协程.A_协程基础

/**
 *
 * 除了由不同的构建器提供协程作用域之外，还可以使用 coroutineScope 构建器声明自己的作用域。
 * 它会创建一个协程作用域并且在所有已启动子协程执行完毕之前不会结束。runBlocking 与 coroutineScope 可能看起来很类似，
 * 因为它们都会等待其协程体以及所有子协程结束。 主要区别在于，runBlocking 方法会阻塞当前线程来等待，
 * 而 coroutineScope 只是挂起，会释放底层线程用于其他用途。 由于存在这点差异，runBlocking 是常规函数，而 coroutineScope 是挂起函数。
 * */

import kotlinx.coroutines.*

/**
 * 请注意，（当等待内嵌 launch 时）紧挨“Task from coroutine scope”消息之后， 就会执行并输出“Task from runBlocking”——尽管 coroutineScope 尚未结束。
 *
 * 除去不同的协程构建器提供的协程作用域（coroutine scope）外，我们还可以通过coroutineScope builder来声明自己的协程作用域
 * 该构建器会创建一个协程作用域，并且会等待所有启动的子协程全部完成后自身才会完成。
 *
 * runBlocking 与coroutineScope之间的主要差别在于，后者在等待所有子协程完成其任务时并不会阻塞当前的线程。
 */
fun main() = runBlocking { // this: CoroutineScope
    launch {
        delay(200L)
        println("Task from runBlocking")//2
    }

    coroutineScope { // 创建一个协程作用域
        //coroutineScope 也是最后接受一个函数参数
        launch {
            delay(500L)
            println("Task from nested launch")//3
        }

        delay(100L)
        println("Task from coroutine scope") // 这一行会在内嵌 launch 之前输出 1
    }

    println("Coroutine scope is over") // 这一行在内嵌 launch 执行完毕后才输出 4
}